package com.cj;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionVisitor;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

/**
 * @author cc
 * @date 2025-05-14 09:20
 **/

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    /**
     *  这个时候 beanDefinition已经有了，，但是bean还没有生成,,, 只会执行一次，，， BeanFactory的后置处理器，，factory只有一个
     * @param beanFactory 相当于spring容器
     * @throws BeansException
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("bean factory post processor ====");
        // 获取spring容器中所有的bean name
        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();

        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println("beanDefinitionName = " + beanDefinitionName);
        }

        // 调用getBean方法之后，，会现场生成bean，，，如果需要提前初始化，，可以在这里调用getBean方法，，，
        // 这个比spring容器默认的初始化方法更早，，
//        Object user = beanFactory.getBean("user");


        BeanDefinition userBd = beanFactory.getBeanDefinition("user");

        // 专门用来访问beanDefinition属性的工具
        BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(strVal -> {
            if (strVal.equals("cc")){
                return "waterkid";
            }
            return  strVal;
        });

        // 修改beanDefinition
        visitor.visitBeanDefinition(userBd);
    }
}
